<?php
namespace App\Services\Mqtt;

use Bluerhinos\phpMQTT;

/**
 * mqtt
 */
class Mqtt extends MqttBase
{
	private static $instance;

	private function __construct()
	{
		parent::__construct();
	}
	//公有方法，用于获取实例
    public static function getInstance(){
        //判断实例有无创建，没有的话创建实例并返回，有的话直接返回
        if(!(self::$instance instanceof self)){
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function publish(string $topic, string $message, $client_id, $qos = 0)
	{
		$mqtt = new phpMQTT($this->host, $this->port, $client_id);
		if ($mqtt->connect(true, NULL, $this->username, $this->password)) {
            # 发送信息  第三个参数为Qos服务质量等级
            # Qos0  　发送者只发送一次消息，不进行重试，Broker不会返回确认消息。在Qos0情况下，Broker可能没有接受到消息
            # Qos1  　发送者最少发送一次消息，确保消息到达Broker，Broker需要返回确认消息PUBACK。在Qos1情况下，Broker可能接受到重复消息
            # Qos2  　Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下，Broker肯定会收到消息，且只收到一次
            $mqtt->publish($topic, $message, $qos);
            $mqtt->close(); //关闭

            return true;
        } else {
            return false;
        }

	} 









    //克隆方法私有化，防止复制实例
    private function __clone(){}

}